#!/usr/bin python

from gpioWinbond import WinbondInputOutput
from vyhodnoceniStavuSpinace import VyhodnoceniZmenyStavu
from nacitani1Wire import Pyowfs
import traceback, time
from tabulky import UdalostiAutomatu, SmsProOdeslani
from nacteniKonfigurace import semaforNapeti230V_OK, razitkoNacitaniDatZije, semaforDvereAutomatuOtevreny
from nacteniKonfigurace import semaforPrihlasenTechnik
from podpurneFunkce import vytvorSoubor, vymazSoubor
from logovani import nacitaniDatLogger
import os

#TODO: spravne nastavit kritickou teplotu
oneWire = Pyowfs(intervalNacitaniTeploty = 60, # sekundy
                 kritickaTeplota = 40,  # stupne Celsia
                 intervalKontrolyKritickeTeploty = 30*60, # v jakych intervalech ukladam hodnoty pri prekroceni kriticke teploty
                 intervalProZaznamenavaniTeploty = 60*60,  # 60 minut
#                 tiskTeploty=True
                 )    

spinace = WinbondInputOutput()

dvere = VyhodnoceniZmenyStavu(nazevStavu = "DVERE",
                              popisyZmenyStavu = ("zavreny", "otevreny"),  
                              objektNacteniStavu = spinace.dvereOtevreny, 
                              hysterezePrechodPodHranicniHodnotu = 3, 
                              hysterezePrechodNadHranicniHodnotu = 3,
                              hranicniHodnotaPrechoduStavu = 0.5,  # nacitame digitalni hodnoty 0 a 1
                              tiskni=True, 
                              signalizacniSoubor = semaforDvereAutomatuOtevreny
                              )
                              
napeti230 = VyhodnoceniZmenyStavu(nazevStavu="230V", 
                                  # prvni text v popisu zmeny stavu odpovida stavu pod hranicni hodnotou
                                  # druhy text v popisu zmeny stavu odpovida stavu nad hranicni hodnotou
                                  popisyZmenyStavu = ("odpojeno", "pripojeno"),                                    
                                  objektNacteniStavu = spinace.napajeciNapetiPripojeno,
                                  hysterezePrechodPodHranicniHodnotu = 10*60, # 10 minut
                                  hysterezePrechodNadHranicniHodnotu = 3*60, # 3 minuty
                                  hranicniHodnotaPrechoduStavu = 0.5,  # nacitame digitalni hodnoty 0 a 1
                                  tiskni=True, 
                                  priZmeneStavuZaslatSMS = True,
                                  signalizacniSoubor = semaforNapeti230V_OK                                    
                                  )
                                      
def vymazSignalizacniSoubory():    
    vymazSoubor(semaforPrihlasenTechnik) # jen pro jistotu
    vymazSoubor(razitkoNacitaniDatZije) # jen pro jistotu
    vymazSoubor(semaforNapeti230V_OK) # jen pro jistotu
    vymazSoubor(semaforDvereAutomatuOtevreny) # jen pro jistotu
    
vymazSignalizacniSoubory()
timeoutProOdhlaseniTechnika = 60*15 # kdyz jsou dvere zavreny dele nez 15 min.
#TODO: zaremovat testovaci timeout
#timeoutProOdhlaseniTechnika = 15 # 15s pro testovani SW

vytvorSoubor(semaforNapeti230V_OK) # svindlujeme, GPIO nacitani nam spatne detekuje 230V
while 1:
    try:        
        spinace.nactiAutomatGpio() # Winbond nacitame pouze jednou, ne u kazde instance VyhodnoceniZmenyStavu (setrime procesorovy cas)
        dvere.vyhodnotStav()        
#        napeti230.vyhodnotStav() # u stareho motherboardu nam asi vyhorely GPIO piny, tak trochu svindlujeme a soubor nevytvarime
        if dvere.aktualniStav == "otevreny" and not os.path.exists(semaforPrihlasenTechnik): # kdyz nekdo otevrel dvere a neprilozil iButton technika
            print "dvere:", dvere.aktualniStav
            hudba = "beep -f 1000 -r 3 &"
            os.system(hudba)
        elif dvere.aktualniStav == "zavreny":            
            if os.path.exists(semaforPrihlasenTechnik):
                timestampVytvoreniSouboru = os.stat(semaforPrihlasenTechnik).st_mtime                
                if time.time() > dvere.tStampPrechoduPodHranicniHodnotu + timeoutProOdhlaseniTechnika:
                    if time.time() > timestampVytvoreniSouboru + timeoutProOdhlaseniTechnika: 
                        text = "mazu soubor semaforPrihlasenTechnik" 
                        nacitaniDatLogger.info(text)
                        print text
                        vymazSoubor(semaforPrihlasenTechnik)
        oneWire.nactiSbernici()
        vytvorSoubor(razitkoNacitaniDatZije)
        time.sleep(0.5)        
    except Exception:        
        vymazSignalizacniSoubory()        
        nacitaniDatLogger.critical(traceback.print_exc())
        raise

        
